USE [Bases2]
GO
/****** Object:  StoredProcedure [dbo].[TransferirSaldo]    Script Date: 12/01/2011 13:59:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[TransferirSaldo]
    @cuenta_origen int,
    @cuenta_destino int,
    @monto float,
    @agencia int
AS 
BEGIN
	SET NOCOUNT ON
	BEGIN TRANSACTION
	
	DECLARE @contador int;
	SET @contador=0	;
	
	SELECT @contador=COUNT(1)
	FROM CUENTA
	WHERE id_cuenta=@cuenta_origen 
	OR id_cuenta=@cuenta_destino
	
	IF @contador<=1
	BEGIN
		SELECT 'Alguno o todos los numeros de cuenta que ingreso no existen.';
	END
	ELSE
	BEGIN
		SELECT @contador=COUNT(1)
		FROM BANCO
		INNER JOIN CUENTA ON BANCO.id_banco= CUENTA.id_cuenta 
		INNER JOIN TIPO_CUENTA ON CUENTA.id_tipo_cuenta=TIPO_CUENTA.id_tipo_cuenta
		INNER JOIN CLIENTE_CUENTA ON CLIENTE_CUENTA.id_cuenta=CUENTA.id_cuenta
		INNER JOIN CLIENTE ON CLIENTE.id_cliente=CLIENTE_CUENTA.id_cliente
		INNER JOIN TIPO_CLIENTE ON TIPO_CLIENTE.id_tipo_cliente=CLIENTE.id_tipo_cliente
		INNER JOIN ESTADO_CUENTA ON ESTADO_CUENTA.id_cuenta=CUENTA.id_cuenta
		WHERE (ESTADO_CUENTA.id_tipo_estado=0 OR ESTADO_CUENTA.id_tipo_estado=1)
		AND ESTADO_CUENTA.estado=1
		AND (CUENTA.id_cuenta=@cuenta_origen 
		OR CUENTA.id_cuenta=@cuenta_destino)
		
		IF @contador>0
		BEGIN
			SELECT 'Alguna de las cuentas que ingreso se encuentra bloqueada o cancelada.';
		END
		ELSE
		BEGIN
			DECLARE @DepositosCompensados decimal (18,2), @Debitos decimal (18,2), @Diferencia decimal (18,2)			
			
			SELECT @DepositosCompensados=SUM(monto)
			FROM DEPOSITO
			INNER JOIN CUENTA ON CUENTA.id_cuenta=DEPOSITO.id_cuenta
			WHERE CUENTA.id_cuenta=@cuenta_origen
			AND DEPOSITO.compensado=1												
			
			SELECT @Debitos=SUM(monto)
			FROM DEBITO
			INNER JOIN CUENTA ON CUENTA.id_cuenta=DEBITO.id_cuenta
			WHERE CUENTA.id_cuenta=@cuenta_origen
			
			SET @Diferencia= ISNULL(@DepositosCompensados,0)-ISNULL(@Debitos,0)
			
			IF @Diferencia<@monto
			BEGIN
				SELECT 'La cuenta de origen no cuenta con el monto necesario para la transferencia.'			
			END
			ELSE
			BEGIN
				/**********BITACORA*************/
				DECLARE @Diferencia3 decimal (18,2)
				SELECT @DepositosCompensados=SUM(monto)
				FROM DEPOSITO
				INNER JOIN CUENTA ON CUENTA.id_cuenta=DEPOSITO.id_cuenta
				WHERE CUENTA.id_cuenta=@cuenta_origen
				AND DEPOSITO.compensado=1												
								
				SELECT @Debitos=SUM(monto)
				FROM DEBITO
				INNER JOIN CUENTA ON CUENTA.id_cuenta=DEBITO.id_cuenta
				WHERE CUENTA.id_cuenta=@cuenta_origen
							
				SET @Diferencia3= ISNULL(@DepositosCompensados,0)-ISNULL(@Debitos,0)
				/**********BITACORA*************/
			
				SELECT TOP(1) @contador=DEPOSITO.id_deposito
				FROM DEPOSITO
				ORDER BY DEPOSITO.id_deposito DESC
				
				IF @Contador IS NULL
				BEGIN
					SET @Contador=-1
				END
				
				SET @contador=@contador+1
								
				INSERT INTO DEPOSITO VALUES(@contador,@monto,@cuenta_destino,@agencia,1,NULL)
				
				SELECT TOP(1) @contador=DEBITO.id_debito
				FROM DEBITO
				ORDER BY DEBITO.id_debito DESC
				
				IF @Contador IS NULL
				BEGIN
					SET @Contador=-1
				END
				
				SET @contador=@contador+1
								
				INSERT INTO DEBITO VALUES(@contador,@monto,@agencia,@cuenta_origen)
				
				/**********BITACORA*************/
				DECLARE @Diferencia2 decimal (18,2)
				SELECT @DepositosCompensados=SUM(monto)
				FROM DEPOSITO
				INNER JOIN CUENTA ON CUENTA.id_cuenta=DEPOSITO.id_cuenta
				WHERE CUENTA.id_cuenta=@cuenta_origen
				AND DEPOSITO.compensado=1												
								
				SELECT @Debitos=SUM(monto)
				FROM DEBITO
				INNER JOIN CUENTA ON CUENTA.id_cuenta=DEBITO.id_cuenta
				WHERE CUENTA.id_cuenta=@cuenta_origen
						
				SET @Diferencia2= ISNULL(@DepositosCompensados,0)-ISNULL(@Debitos,0)
							
				DECLARE @Diferencia4 decimal (18,2)
				SELECT @DepositosCompensados=SUM(monto)
				FROM DEPOSITO
				INNER JOIN CUENTA ON CUENTA.id_cuenta=DEPOSITO.id_cuenta
				WHERE CUENTA.id_cuenta=@cuenta_destino
				AND DEPOSITO.compensado=1												
								
				SELECT @Debitos=SUM(monto)
				FROM DEBITO
				INNER JOIN CUENTA ON CUENTA.id_cuenta=DEBITO.id_cuenta
				WHERE CUENTA.id_cuenta=@cuenta_destino
					
				SET @Diferencia4= ISNULL(@DepositosCompensados,0)-ISNULL(@Debitos,0)
								
				SET @contador=-1							
				SELECT TOP(1) @contador=BITACORA.id_bitacora
				FROM BITACORA
				ORDER BY BITACORA.id_bitacora DESC
							
				IF @contador IS NULL
				BEGIN
					SET @contador=-1
				END
								
				SET @contador=@contador+1							
								
				INSERT INTO BITACORA VALUES(@contador,GETDATE(),2,@cuenta_origen,@Diferencia,@monto,@Diferencia2,'Se debito por una transferencia.')
				INSERT INTO BITACORA VALUES(@contador+1,GETDATE(),2,@cuenta_destino,@Diferencia3,@monto,@Diferencia4,'Se deposito por una transferencia.')
				/**********BITACORA*************/
				
				SELECT 'Transferencia realizada correctamente'
			END				
		END
	END	
	
	COMMIT
	SET NOCOUNT OFF
END
